做另一面的自己

Mac 上 android 反编译apk完整流程

直接进入正题,如果要在mac下反编绎apk跟在window下还是有点区别的,但是大体原理是一样的。首先下载三个工具:
Apktool
dex2jar
jd-gui

分别介绍下这几个应用在mac下的安装
Apktool,官方有明确的文档说明:
Download Mac wrapper script (Right click, Save Link As apktool)
Download apktool-2
Rename downloaded jar to apktool.jar
Move both files (apktool.jar & apktool) to /usr/local/bin (root needed)
Make sure both files are executable (chmod a+x filename)
Try running apktool via cli

这样你就配置了bash权限,可以执行apktool命令,回车可以查看其命令集

1
apktool d file.apk

这样就能生成一个file的文件夹,就生成了资源文件,smile文件,如果修改了生成apk文件

1
apktool b file

上面的build和dist就是回编译apk过程中生成的东西,编译出来的apk在dist目录下,打开build/apk文件夹会发现少了original文件夹下的META-INF文件夹,也就意味着dist里的apk文件是没有签名的。

dex2jar,我们把.apk重命名成.zip,解压,取出classess.dex。我们要用dex2jar将apk转成jar文件,实质是将apk里的classes.dex转成jar。然后进到dex2jar这个文件夹下运行:

1
sh d2j-dex2jar.sh classes.dex

可能会出现

1
d2j-dex2jar.sh: line 36: ./d2j_invoke.sh: Permission denied

这时候就将dex2jar里的d2j_invoke.sh/d2j-dex2jar.sh增加可执行权限

1
2
chmod +x ./d2j_invoke.sh
sh d2j-dex2jar.sh classes.dex

这样就生成了classes-dex2jar.jar,

打开JD-GUI,将hongbao-dex2jar.jar拖进去就看到源码了。 通过看Java源码对比smali文件,修改后回编译就ok了!
如何手动给apk增加签名?

回编译后的apk是安装不成功的,总是提示
Failure [INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION] 实质是没签名。

1,生成签名:

1
keytool -genkey -keystore filename.keystore -keyalg RSA -validity 10000 -alias aliasname

注意:上面-keystore后面跟的是签名文件的名字,而-alias是别名,一般情况下-keystore后面跟-alias是一样的,但其实两者没有关系,这也是我故意搞成不一样的原因。
2,为apk增加签名:

1
jarsigner -digestalg SHA1 -sigalg MD5withRSA -tsa -verbose -keystore filename.keystore -signedjar filename-signed.apk filename.apk aliasname

注意:
1,最后的”aliasname”就是-alias后面带的,必须保持一致。
2,如果不带-digestalg SHA1 -sigalg MD5withRSA签名后的apk安装也是不成功的,说INSTALL_PARSE_FAILED_NO_CERTIFICATES的错误,如果不带-tsa会报一个时间方面的警告。